"""
函数封装步骤：
1、功能代码写出来
2、def封装
3、参数化： 变化的数据定义为形参
4、返回值： 判断函数是否有数据需要给调用的人使用

封装的函数的优化：
1、记录日志： 方便问题定位 看到执行过程 == 但凡print看结果 或者debug看结果的地方都记录日志
2、断言失败了，异常捕获：如果断言失败了，记录error日志，然后raise 异常错误 用例失败。

3、因为有些用例可能没有在用例里写断言，不需要断言，在函数做判空处理。

"""
import json

import allure
from jsonpath import jsonpath
from loguru import logger

@allure.step("响应结果断言")
def response_assert(response,expected_result):
    if expected_result is None:
        logger.info("用例不需要做断言！")
        return
    logger.info("----------------断言开始-----------------------")
    expected_result = json.loads(expected_result)
    logger.info(f"期望结果是：{expected_result}")
    for k,v in expected_result.items():
        if k.startswith("$"):
            actual_data = jsonpath(response.json(),k)[0]
            logger.info(f"执行结果是：{actual_data}")
            try:
                assert actual_data == v
                logger.info("断言成功，用例通过！")
            except AssertionError as e:
                logger.error("断言失败，用例不通过！")
                raise e
        elif k == "text":
            actual_data =  response.text
            logger.info(f"执行结果是：{actual_data}")
            try:
                assert actual_data == v
                logger.info("断言成功，用例通过！")
            except AssertionError as e:
                logger.error("断言失败，用例不通过！")
                raise e
